using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._3DFeatures._Conversion
{
    /// <summary>
    /// <para>Feature Class Z To ASCII</para>
    /// <para>Exports 3D features to ASCII text files storing GENERATE, XYZ, or profile data.</para>
    /// <para>将 3D 要素导出为存储 GENERATE、XYZ 或纵断面数据的 ASCII 文本文件。</para>
    /// </summary>    
    [DisplayName("Feature Class Z To ASCII")]
    public class FeatureClassZToASCII : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public FeatureClassZToASCII()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_feature_class">
        /// <para>Input Features</para>
        /// <para>The 3D point, multipoint, polyline, or polygon feature class that will be exported to an ASCII file.</para>
        /// <para>将导出为 ASCII 文件的 3D 点、多点、折线或面要素类。</para>
        /// </param>
        /// <param name="_output_location">
        /// <para>Output Location</para>
        /// <para>The folder to which output files will be written.</para>
        /// <para>将输出文件写入的文件夹。</para>
        /// </param>
        /// <param name="_out_file">
        /// <para>Output Text File</para>
        /// <para><xdoc>
        ///   <para>The name of the resulting ASCII file.</para>
        ///   <para>If a line or polygon feature class is exported to XYZ format, the file name is used as a base name. Each feature will have a unique file output, since the XYZ format only supports one line or polygon per file. Multipart features will also have each part written to a separate file. The file name will be appended with the OID of each feature, as well as any additional characters needed to make each file name unique.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>生成的 ASCII 文件的名称。</para>
        ///   <para>如果将线或面要素类导出为 XYZ 格式，则文件名将用作基本名称。每个要素都将具有唯一的文件输出，因为 XYZ 格式仅支持每个文件一条线或面。多部分功能还会将每个部分写入单独的文件。文件名将附加每个功能的 OID，以及使每个文件名唯一所需的任何其他字符。</para>
        /// </xdoc></para>
        /// </param>
        public FeatureClassZToASCII(object _in_feature_class, object _output_location, object _out_file)
        {
            this._in_feature_class = _in_feature_class;
            this._output_location = _output_location;
            this._out_file = _out_file;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Feature Class Z To ASCII";

        public override string CallName => "3d.FeatureClassZToASCII";

        public override List<string> AcceptEnvironments => ["extent", "geographicTransformations", "outputCoordinateSystem", "workspace"];

        public override object[] ParameterInfo => [_in_feature_class, _output_location, _out_file, _format.GetGPValue(), _delimiter.GetGPValue(), _decimal_format.GetGPValue(), _digits_after_decimal, _decimal_separator.GetGPValue(), _derived_output];

        /// <summary>
        /// <para>Input Features</para>
        /// <para>The 3D point, multipoint, polyline, or polygon feature class that will be exported to an ASCII file.</para>
        /// <para>将导出为 ASCII 文件的 3D 点、多点、折线或面要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_feature_class { get; set; }


        /// <summary>
        /// <para>Output Location</para>
        /// <para>The folder to which output files will be written.</para>
        /// <para>将输出文件写入的文件夹。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Location")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _output_location { get; set; }


        /// <summary>
        /// <para>Output Text File</para>
        /// <para><xdoc>
        ///   <para>The name of the resulting ASCII file.</para>
        ///   <para>If a line or polygon feature class is exported to XYZ format, the file name is used as a base name. Each feature will have a unique file output, since the XYZ format only supports one line or polygon per file. Multipart features will also have each part written to a separate file. The file name will be appended with the OID of each feature, as well as any additional characters needed to make each file name unique.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>生成的 ASCII 文件的名称。</para>
        ///   <para>如果将线或面要素类导出为 XYZ 格式，则文件名将用作基本名称。每个要素都将具有唯一的文件输出，因为 XYZ 格式仅支持每个文件一条线或面。多部分功能还会将每个部分写入单独的文件。文件名将附加每个功能的 OID，以及使每个文件名唯一所需的任何其他字符。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Text File")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_file { get; set; }


        /// <summary>
        /// <para>ASCII Format</para>
        /// <para><xdoc>
        ///   <para>Specifies the format of the ASCII file being created.</para>
        ///   <bulletList>
        ///     <bullet_item>GENERATE—Writes output in the GENERATE format. This is the default.</bullet_item><para/>
        ///     <bullet_item>XYZ—Writes XYZ information of input features. One file will be created for each line or polygon in the input feature.</bullet_item><para/>
        ///     <bullet_item>Profile—Writes profile information for line features that can be used in external graphing applications.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定正在创建的 ASCII 文件的格式。</para>
        ///   <bulletList>
        ///     <bullet_item>GENERATE - 以 GENERATE 格式写入输出。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>XYZ - 写入输入要素的 XYZ 信息。将为输入要素中的每条线或面创建一个文件。</bullet_item><para/>
        ///     <bullet_item>剖面图 （Profile） - 为可在外部图形应用程序中使用的线要素写入剖面图信息。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("ASCII Format")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _format_value _format { get; set; } = _format_value._GENERATE;

        public enum _format_value
        {
            /// <summary>
            /// <para>GENERATE</para>
            /// <para>GENERATE—Writes output in the GENERATE format. This is the default.</para>
            /// <para>GENERATE - 以 GENERATE 格式写入输出。这是默认设置。</para>
            /// </summary>
            [Description("GENERATE")]
            [GPEnumValue("GENERATE")]
            _GENERATE,

            /// <summary>
            /// <para>XYZ</para>
            /// <para>XYZ—Writes XYZ information of input features. One file will be created for each line or polygon in the input feature.</para>
            /// <para>XYZ - 写入输入要素的 XYZ 信息。将为输入要素中的每条线或面创建一个文件。</para>
            /// </summary>
            [Description("XYZ")]
            [GPEnumValue("XYZ")]
            _XYZ,

            /// <summary>
            /// <para>Profile</para>
            /// <para>Profile—Writes profile information for line features that can be used in external graphing applications.</para>
            /// <para>剖面图 （Profile） - 为可在外部图形应用程序中使用的线要素写入剖面图信息。</para>
            /// </summary>
            [Description("Profile")]
            [GPEnumValue("PROFILE")]
            _PROFILE,

        }

        /// <summary>
        /// <para>Delimiter</para>
        /// <para><xdoc>
        ///   <para>Specifies the delimiter that will indicate the separation of entries in the columns of the text file table.</para>
        ///   <bulletList>
        ///     <bullet_item>Space—A space will be used to delimit field values. This is the default.</bullet_item><para/>
        ///     <bullet_item>Comma—A comma will be used to delimit field values. This option is not applicable if the decimal separator is also a comma.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定分隔符，该分隔符将指示文本文件表列中条目的分隔符。</para>
        ///   <bulletList>
        ///     <bullet_item>空格—空格将用于分隔字段值。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>逗号—逗号将用于分隔字段值。如果小数分隔符也是逗号，则此选项不适用。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Delimiter")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _delimiter_value _delimiter { get; set; } = _delimiter_value._SPACE;

        public enum _delimiter_value
        {
            /// <summary>
            /// <para>Comma</para>
            /// <para>Comma—A comma will be used to delimit field values. This option is not applicable if the decimal separator is also a comma.</para>
            /// <para>逗号—逗号将用于分隔字段值。如果小数分隔符也是逗号，则此选项不适用。</para>
            /// </summary>
            [Description("Comma")]
            [GPEnumValue("COMMA")]
            _COMMA,

            /// <summary>
            /// <para>Space</para>
            /// <para>Space—A space will be used to delimit field values. This is the default.</para>
            /// <para>空格—空格将用于分隔字段值。这是默认设置。</para>
            /// </summary>
            [Description("Space")]
            [GPEnumValue("SPACE")]
            _SPACE,

        }

        /// <summary>
        /// <para>Decimal Notation</para>
        /// <para><xdoc>
        ///   <para>Specifies the method that will determine the number of significant digits stored in the output files.</para>
        ///   <bulletList>
        ///     <bullet_item>Automatically Determined—The number of significant digits needed to preserve the available precision, while removing unnecessary trailing zeros, is automatically determined. This is the default.</bullet_item><para/>
        ///     <bullet_item>Specified Number—The number of significant digits is defined in the Digits after Decimal parameter.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将确定存储在输出文件中的有效位数的方法。</para>
        ///   <bulletList>
        ///     <bullet_item>自动确定 - 自动确定保持可用精度所需的有效位数，同时删除不必要的尾随零。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>指定数字 （Specified Number） - 有效位数在十进制后的数字参数中定义。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Decimal Notation")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _decimal_format_value _decimal_format { get; set; } = _decimal_format_value._AUTOMATIC;

        public enum _decimal_format_value
        {
            /// <summary>
            /// <para>Automatically Determined</para>
            /// <para>Automatically Determined—The number of significant digits needed to preserve the available precision, while removing unnecessary trailing zeros, is automatically determined. This is the default.</para>
            /// <para>自动确定 - 自动确定保持可用精度所需的有效位数，同时删除不必要的尾随零。这是默认设置。</para>
            /// </summary>
            [Description("Automatically Determined")]
            [GPEnumValue("AUTOMATIC")]
            _AUTOMATIC,

            /// <summary>
            /// <para>Specified Number</para>
            /// <para>Specified Number—The number of significant digits is defined in the Digits after Decimal parameter.</para>
            /// <para>指定数字 （Specified Number） - 有效位数在十进制后的数字参数中定义。</para>
            /// </summary>
            [Description("Specified Number")]
            [GPEnumValue("FIXED")]
            _FIXED,

        }

        /// <summary>
        /// <para>Digits after Decimal</para>
        /// <para>The number of digits written after the decimal for floating-point values written to the output files. This parameter is used when the Decimal Notation parameter is set to Specified Number (decimal_format=FIXED in Python).</para>
        /// <para>写入输出文件的浮点值的小数点后写入的位数。当十进制表示法参数设置为指定数字（在 Python 中为 decimal_format=固定）时，使用此参数。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Digits after Decimal")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public long _digits_after_decimal { get; set; } = 3;


        /// <summary>
        /// <para>Decimal Separator</para>
        /// <para><xdoc>
        ///   <para>Specifies the decimal character that will differentiate the integer of a number from its fractional part.</para>
        ///   <bulletList>
        ///     <bullet_item>Point—A point is used as the decimal character. This is the default.</bullet_item><para/>
        ///     <bullet_item>Comma—A comma is used as the decimal character.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将数字的整数与其小数部分区分开来的十进制字符。</para>
        ///   <bulletList>
        ///     <bullet_item>点 - 点用作十进制字符。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>逗号 - 逗号用作十进制字符。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Decimal Separator")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _decimal_separator_value _decimal_separator { get; set; } = _decimal_separator_value._DECIMAL_POINT;

        public enum _decimal_separator_value
        {
            /// <summary>
            /// <para>Point</para>
            /// <para>Point—A point is used as the decimal character. This is the default.</para>
            /// <para>点 - 点用作十进制字符。这是默认设置。</para>
            /// </summary>
            [Description("Point")]
            [GPEnumValue("DECIMAL_POINT")]
            _DECIMAL_POINT,

            /// <summary>
            /// <para>Comma</para>
            /// <para>Comma—A comma is used as the decimal character.</para>
            /// <para>逗号 - 逗号用作十进制字符。</para>
            /// </summary>
            [Description("Comma")]
            [GPEnumValue("DECIMAL_COMMA")]
            _DECIMAL_COMMA,

        }

        /// <summary>
        /// <para>Updated Folder</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Updated Folder")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _derived_output { get; set; }


        public FeatureClassZToASCII SetEnv(object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object workspace = null)
        {
            base.SetEnv(extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, workspace: workspace);
            return this;
        }

    }

}